package com.sxit.ecwx.core.utils;


import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * 
 * 作者:admin
 * 时间:2011-11-20
 */
public class DateUtils {

    public DateUtils() {

    }

    public final static Calendar myc = Calendar.getInstance();

    /**
     * 获得当天时间
     * 
     * @param parrten
     *            输出的时间格式
     * @return 返回时间
     */
    public static String getTime(String parrten) {

        String timestr;
        if (parrten == null || parrten.equals("")) {
            parrten = "yyyyMMddHHmmss";
        }
        java.text.SimpleDateFormat sdf = new SimpleDateFormat(parrten);
        java.util.Date cday = new Date();
        timestr = sdf.format(cday);
        return timestr;
    }

    /**
     * 获得当天日期
     * 
     * @param parrten
     * @return
     */
    public static String getDate(String parrten) {

        if (parrten == null || parrten.equals("")) {
            parrten = "yyyy-MM-dd";
        }
        return DateUtils.getTime(parrten);
    }

    /**
     * 时间格式转换
     * 
     * @param cday
     * @param parrten
     * @return
     */
    public static String getTime(Date cday, String parrten) {

        String timestr;
        if (parrten == null || parrten.equals("")) {
            parrten = "yyyyMMddHHmmss";
        }
        java.text.SimpleDateFormat sdf = new SimpleDateFormat(parrten);
        timestr = sdf.format(cday);
        return timestr;
    }

    /**
     * 日期格式转换
     * 
     * @param parrten
     * @return
     */
    public static String getDate(Date date, String parrten) {

        if (parrten == null || parrten.equals("")) {
            parrten = "yyyy-MM-dd";
        }
        return DateUtils.getTime(date, parrten);
    }

    /**
     * 得到昨天的时间
     * 
     * @return
     */
    public static String getYestday() {

        String timestr;
        java.util.Calendar cc = myc;
        cc.roll(Calendar.DAY_OF_YEAR, -1);
        java.text.SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        if ((cc.get(Calendar.MONTH) + 1) == 1 && cc.get(Calendar.DAY_OF_MONTH) == 1) {
            cc.roll(Calendar.YEAR, 1);
        }

        timestr = sdf.format(cc.getTime());
        return timestr;
    }

    /**
     * 将字串转换为指定格式的日期
     * 
     * @param time
     *            时间
     * @param parrten
     *            为空时，将使用yyyy-MM-dd格式
     * @return
     */
    public static Date StrToDate(String time, String parrten) {

        if (parrten == null || parrten.equals("")) {
            parrten = "yyyy-MM-dd";
        }
        SimpleDateFormat formatter = new SimpleDateFormat(parrten);
        ParsePosition pos = new ParsePosition(0);
        Date dt1 = formatter.parse(time, pos);
        return dt1;
    }



    /**
     * @param t1 时间字符串
     * @param parrten 原始格式
     * @return
     */
    public static String getTime(String t1, String parrten) {
        SimpleDateFormat formatter = new SimpleDateFormat(parrten);
        SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy年MM月dd日");
        ParsePosition pos = new ParsePosition(0);
        Date dt1 = formatter.parse(t1, pos);
        return formatter2.format(dt1);
    }

    /**
     * 将时间转换为parrten2格式
     * 
     * @param t1
     *            时间字符�?
     * @param parrten
     *            原时间格�?
     * @param parrten2
     *            要转化的格式
     * @return
     */
    public static String getTime(String t1, String parrten, String parrten2) {

        SimpleDateFormat formatter = new SimpleDateFormat(parrten);
        SimpleDateFormat formatter2 = new SimpleDateFormat(parrten2);
        ParsePosition pos = new ParsePosition(0);
        Date dt1 = formatter.parse(t1, pos);
        return formatter2.format(dt1);
    }


    /**
     * 比较两个日期相差的天�?
     * 
     * @param time1
     * @param time2
     * @return
     */
    public static int compareTime2(String time1, String time2) {

        return compareStringTimes(time1, time2, "yyyy-MM-dd");
    }

    public static String addTime(String datetime, String parrten, long days) {

        SimpleDateFormat formatter = new SimpleDateFormat(parrten);
        ParsePosition pos = new ParsePosition(0);
        Date dt1 = formatter.parse(datetime, pos);
        long l = dt1.getTime() / 1000 + days * 24 * 60 * 60;
        dt1.setTime(l * 1000);
        String mydate = formatter.format(dt1);

        return mydate;
    }

    public static String jianTime(String datetime, String parrten, long days) {

        SimpleDateFormat formatter = new SimpleDateFormat(parrten);
        ParsePosition pos = new ParsePosition(0);
        Date dt1 = formatter.parse(datetime, pos);
        long l = dt1.getTime() / 1000 - days * 24 * 60 * 60;
        dt1.setTime(l * 1000);
        String mydate = formatter.format(dt1);

        return mydate;
    }

    /**
     * 取得昨天的日�?,以今天为基准
     * 
     * @return
     */
    public static String getYestdayBaseToday() {

        String timestr;

        Calendar calendar = Calendar.getInstance();

        calendar.roll(Calendar.DAY_OF_YEAR, -1);

        Calendar tempCalendar = Calendar.getInstance();
        tempCalendar.setTime(calendar.getTime());
        if (tempCalendar.get(Calendar.DAY_OF_YEAR) == 1) {
            calendar.roll(Calendar.YEAR, -1);
        }

        java.text.SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        timestr = sdf.format(calendar.getTime());
        return timestr;

    }

    /**
     * 取得指定日期的前�?�?
     * 
     * @param date
     * @return
     */
    public static Date getPreDate(Date date) {

        Calendar calendar = Calendar.getInstance();

        Date tempDate = date;

        calendar.setTime(date);
        calendar.roll(Calendar.DAY_OF_YEAR, -1);

        Calendar cal = Calendar.getInstance();

        cal.setTime(tempDate);

        if (cal.get(Calendar.DAY_OF_YEAR) == 1) {
            calendar.roll(Calendar.YEAR, -1);
        }

        Date preDate = calendar.getTime(); // 得到前一天的日期
        return preDate;

    }

    /**
     * @author admin
     * @version 2007-5-17
     * @return 当前时间的后�?�?
     * @param date
     * @return
     */
	public static String endDate(Date date) {

        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        ca.add(Calendar.DAY_OF_MONTH, 1);
        String e = ca.get(ca.YEAR) + "-" + (ca.get(ca.MONTH) + 1) + "-" + ca.get(ca.DATE);
        return e;
    }
    
    /**
     * 格式化日�?  指定格式
     * @param date
     * @param formatStyle
     * @return
     */
    public static String formatDate(Date date,String formatStyle){
    	String defaultStyle="yyyy-MM-dd HH:mm:ss";
    	if(formatStyle!=null && !formatStyle.equals(""))
    		defaultStyle=formatStyle;
    	DateFormat df=new SimpleDateFormat(defaultStyle);
    	String dt=df.format(date);
    	return dt;
    }
    /**
     * 格式化日�? 默认格式:yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     */
    public static String formatDate(Date date){
    	return formatDate(date,null);
    }
	
	/**
	 * 
	 *描述：比较两个时间相差的天数
	 *时间�?2010-1-14
	 *作�?�：admin
	 *参数�?
	 *返回�?:0表示相等�?>0表示t1�?,<0表示t2�?
	 *抛出异常�?
	 */
	public static int compareStringTimes(String t1, String t2, String parrten) {

        SimpleDateFormat formatter = new SimpleDateFormat(parrten);
        ParsePosition pos = new ParsePosition(0);
        ParsePosition pos1 = new ParsePosition(0);
        Date dt1 = formatter.parse(t1, pos);
        Date dt2 = formatter.parse(t2, pos1);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dt1);
        int day1 = calendar.get(Calendar.DAY_OF_YEAR);
        calendar.setTime(dt2);
        int day2 = calendar.get(Calendar.DAY_OF_YEAR);
        return (day1 - day2);

    }
    
	/**
	 * 获取某年上一个月
	 *@author  
	 *@date 	  2010-2-10
	 *@param currDate  当前时间
	 *@param parrten    
	 *@return
	 *@return String
	 *@remark
	 */
	public static String  getPrevMonth(String currDate ,String parrten){
		if (parrten == null || parrten.equals("")) {
			parrten = "yyyy-MM";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(parrten);  
        Calendar   calendar = Calendar.getInstance(); 
        Date mydate = new Date();
        try {
			mydate = sdf.parse(currDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
        calendar.setTime(mydate);   
        calendar.add(Calendar.MONTH, -1);
        String result =sdf.format(calendar.getTime()).toString();
		return  result;
	}
	
	/**
	 * 获取某年下一个月
	 *@author   
	 *@date 	  2010-2-10
	 *@param currDate
	 *@param parrten
	 *@return
	 *@return String
	 *@remark
	 */
	public static String  getNextMonth(String currDate ,String parrten){
		if (parrten == null || parrten.equals("")) {
			parrten = "yyyy-MM";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(parrten);  
        Calendar   calendar = Calendar.getInstance(); 
        Date mydate = new Date();
        try {
			mydate = sdf.parse(currDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
        calendar.setTime(mydate);   
        calendar.add(Calendar.MONTH, 1);
        String result =sdf.format(calendar.getTime()).toString();
		return  result;
	}
	
	/**
	 * 获取上一�?
	 *@author   
	 *@date 	  2010-2-10
	 *@param currYear
	 *@return
	 *@return String
	 *@remark
	 */
	public static String  getPrevYear(String currYear){
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");  
        Calendar   calendar = Calendar.getInstance(); 
        Date mydate = new Date();
        try {
			mydate = sdf.parse(currYear);
		} catch (ParseException e) {
			e.printStackTrace();
		}
        calendar.setTime(mydate);   
        calendar.add(Calendar.YEAR, -1);
        String result =sdf.format(calendar.getTime()).toString();
		return  result;
	}
	
	/**
	 * 获取下一�?
	 *@author   
	 *@date 	  2010-2-10
	 *@param currYear
	 *@return
	 *@return String
	 *@remark
	 */
	public static String  getNextYear(String currYear){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");  
        Calendar   calendar = Calendar.getInstance(); 
        Date mydate = new Date();
        try {
			mydate = sdf.parse(currYear);
		} catch (ParseException e) {
			e.printStackTrace();
		}
        calendar.setTime(mydate);   
        calendar.add(Calendar.YEAR, 1);
        String result =sdf.format(calendar.getTime()).toString();
		return  result;
	}
	
	
	

	/**
     * 功能说明:得到指定月份的最后一�?
     * @author admin
     * @version Feb 16, 2009
     * @return
     */
    public static String getLastDate(Date date){
    	//Date date=new Date(month);	
    	Calendar cal = Calendar.getInstance(); 
    	cal.setTime(date);
    	//当前月＋1，即下个�?
    	cal.add(Calendar.MONTH,1); 
    	//将下个月1号作为日期初始zhii
    	cal.set(Calendar.DATE,1); 
        //下个�?1号减去一天，即得到当前月�?后一�?
    	cal.add(Calendar.DATE,-1);      
    	SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd");       
    	String day_end=df.format(cal.getTime());   
    	//System.out.println("day_end>>>"+day_end);  
    	return day_end;
    }
    /**
     * 功能说明:得到指定月份的最后一�?
     * @author admin
     * @version Feb 16, 2009
     * @return
     */
    public static String getLastDate(String date){
    	Date newDate=DateUtils.StrToDate(date, "");
    	//Date date=new Date(month);	
    	Calendar cal = Calendar.getInstance(); 
    	cal.setTime(newDate);
    	//当前月＋1，即下个�?
    	cal.add(Calendar.MONTH,1); 
    	//将下个月1号作为日期初始zhii
    	cal.set(Calendar.DATE,1); 
        //下个�?1号减去一天，即得到当前月�?后一�?
    	cal.add(Calendar.DATE,-1);      
    	SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd");       
    	String day_end=df.format(cal.getTime());   
    	//System.out.println("day_end>>>"+day_end);  
    	return day_end;
    }
    
    /**
     * 功能说明:得到�?年的�?后一�?
     * @author admin
     * @version Feb 16, 2009
     * @return
     */
    public static String getLastYearByDate(String year){
    	Calendar cal = Calendar.getInstance(); 
    	String newYear=year+"-01-01";//�?年的第一�?
    	Date date=DateUtils.StrToDate(newYear, "yyyy-mm-dd");
    	cal.setTime(date);
    	cal.add(Calendar.MONTH,12); 
    	cal.add(Calendar.DATE,-1); 
    	SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd");       
    	String day_end=df.format(cal.getTime());   
    	//System.out.println("day_end>>>"+day_end);  
    	return day_end;
    }
    
    /**
     * 
     * 功能说明:得到两个时间相差的小时数
     * @param: @param t1 以前的时间
     * @param: @param t2 最新的时间
     * @param: @param parrten  格式    
     * @return: void     
     * @author: admin
     * @date: 2012 3 7 10:28:49
     */
    public static Double  compareStringTimesToHour(Date t1, Date t2, String parrten){
    	Double result=null;
    	SimpleDateFormat sdf = new SimpleDateFormat(parrten);
    	 //默认为毫秒，除以1000是为了转换成秒
	  	long interval=(t2.getTime()-t1.getTime())/1000;//秒
	  	long day=interval/(24*3600);//天
	  	long hour=interval%(24*3600)/3600;//小时
	  	long minute=interval%3600/60;//分钟
	  	
	  	Double dayToHour=new Double(Double.parseDouble(new Long(day).toString())*24);
	  	Double hourToHour=new Double(Double.parseDouble(new Long(hour).toString()));
	  	Double minuteToHour=new Double(NumberUtils.divide(Double.parseDouble(new Long(minute).toString()), 60d, 1));
	  	result=new Double(dayToHour.doubleValue()+hourToHour.doubleValue()+minuteToHour.doubleValue());
    	return result;
    }

    public static String getNextDayDate(Date curDate,Integer dayCount,String parrten){
		if (parrten == null || parrten.equals("")) {
			parrten = "yyyy-MM-dd";
		}
		java.text.SimpleDateFormat sdf = new SimpleDateFormat(parrten);

		Calendar calendar = Calendar.getInstance();
		try {
			String strDate=DateUtils.getDate(curDate, parrten);
			calendar.setTime(sdf.parse(strDate));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		calendar.add(Calendar.DAY_OF_MONTH, dayCount.intValue());
		return sdf.format(calendar.getTime());
	}
    
    /**
	 * 
	 * 功能说明:以传入的时间为基础计算hourCount为目标时间，最终以parrten格式返回
	 * @param: @param curDate
	 * @param: @param hourCount
	 * @param: @param parrten
	 * @param: @return      
	 * @return: String     
	 * @author:admin
	 * @date: 2012 5 16 13:17:33
	 */
	public static String getNextHourDate(Date curDate,Integer hourCount,String parrten){
		if (parrten == null || parrten.equals("")) {
			parrten = "yyyy-MM-dd";
		}
		java.text.SimpleDateFormat sdf = new SimpleDateFormat(parrten);

		Calendar calendar = Calendar.getInstance();
		try {
			String strDate=DateUtils.getDate(curDate, parrten);
			calendar.setTime(sdf.parse(strDate));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		calendar.add(Calendar.HOUR_OF_DAY, hourCount.intValue());
		return sdf.format(calendar.getTime());
	}
	
	/**
	 * 
	 * 功能说明:以传入的时间为基础计算hourCount为目标时间，最终以parrten格式返回
	 * @param: @param curDate
	 * @param: @param hourCount
	 * @param: @param parrten
	 * @param: @return      
	 * @return: String     
	 * @author:admin
	 * @date: 2012 5 16 13:17:33
	 */
	public static String getPreHourDate(Date curDate,Integer hourCount,String parrten){
		if (parrten == null || parrten.equals("")) {
			parrten = "yyyy-MM-dd";
		}
		java.text.SimpleDateFormat sdf = new SimpleDateFormat(parrten);

		Calendar calendar = Calendar.getInstance();
		try {
			String strDate=DateUtils.getDate(curDate, parrten);
			calendar.setTime(sdf.parse(strDate));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		calendar.add(Calendar.HOUR_OF_DAY, -hourCount.intValue());
		return sdf.format(calendar.getTime());
	}
	
	/**
	 * 
	 * 功能说明:得到指定日期的month个月   
	 * @param: @param currDate
	 * @param: @param month
	 * @param: @param parrten
	 * @param: @return      
	 * @return: String     
	 * @author:admin 
	 * @date: 2012 7 6 09:39:44
	 */
	public static String  getNextMonthDate(String currDate,Integer month,String parrten){
		if (parrten == null || parrten.equals("")) {
			parrten = "yyyy-MM";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(parrten);  
        Calendar   calendar = Calendar.getInstance(); 
        Date mydate = new Date();
        try {
			mydate = sdf.parse(currDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
        calendar.setTime(mydate);   
        calendar.add(Calendar.MONTH, month.intValue());
        String result =sdf.format(calendar.getTime()).toString();
		return  result;
	}
	
	/**功能说明：将毫秒数转换为时间
	 * @param longTime 毫秒
	 * @param parrten 样式
	 * @return
	 */
	public static String paseLongToDate(long longTime,String parrten){
		SimpleDateFormat sdf = new SimpleDateFormat(parrten);
		Date date=new Date(longTime);
		String result=sdf.format(date);
		return result;
	}
	
	public static String paseDateToLong(String date){
		SimpleDateFormat  sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			Date paseDate=sf.parse(date);
			return paseDate.getTime()+"";
		} catch (ParseException e) {
			System.out.println("日期解析错误，DateUtils[paseDateToLong()]");
			return System.currentTimeMillis()+"";
		}
	}
	
	
	/**
	　　*功能：截取两个日期之间的天数
	　　* @param String beginDate,String endDate
	　　* @return int
	　　* @throws ParseException
	　　* */
	public static int getDay(String beginDate,String endDate,String parrten){
		SimpleDateFormat sim = new SimpleDateFormat( "yyyy-MM-dd");
		Date d1=null;
		Date d2=null;
		try {
			d1 = sim.parse(beginDate);
			d2 = sim.parse(endDate);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
		return (int) ((d2.getTime() - d1.getTime()) / (3600L * 1000 * 24));
	}
	
	/**
	 * 功能说明：返回edTime 前interval个月的时间
	 * @param edTime 结束时间
	 * @param interval 
	 * @return
	 */
	public static String getDate(int interval){
		StringBuffer sbf=new StringBuffer();
		String curdate=getDate("yyyyMM");
		String year=curdate.substring(0, 3);
		String month=curdate.substring(3);
		int i=Integer.parseInt(month);
		if(interval>i){
			int retYear=Integer.parseInt(year)-1;
			int retMonth=i+12-interval;
			sbf.append(retYear+""+retMonth+"01");
		}
		else{
			int retMonth=i-interval;
			sbf.append(year+""+retMonth+"01");
		}
		return sbf.toString();
	}
	
	public static void main(String[] args) {
		String varYM="201211";
		String last=getLastDate(varYM.substring(0, 4)+"-"+varYM.substring(4)+"-01");
		System.out.println(last);//2012-11-30
		System.out.println(last.substring(8));
	}
}
